home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / grub-legacy / update-grub < prev   
Text File  |  2009-10-29  |  31KB  |  1,095 lines

  1. #!/bin/bash
  2. #
  3. # Insert a list of installed kernels in a grub config file
  4. #   Copyright 2001 Wichert Akkerman <wichert@linux.com>
  5. #   Copyright (C) 2007,2008  Free Software Foundation, Inc.
  6. #
  7. # This file is free software; you can redistribute it and/or modify it
  8. # under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful, but
  13. # WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. # General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. # Contributors:
  21. #    Jason Thomas <jason@debian.org>
  22. #    David B.Harris <dbarclay10@yahoo.ca>
  23. #    Marc Haber <mh+debian-packages@zugschlus.de>
  24. #    Crispin Flowerday <crispin@zeus.com>
  25.  
  26. # Abort on errors
  27. set -e
  28.  
  29. host_os=`uname -s | tr '[A-Z]' '[a-z]'`
  30.  
  31. abort() {
  32.     message=$@
  33.  
  34.     echo >&2
  35.     echo -e "$message" >&2
  36.     echo >&2
  37.     exit 1
  38. }
  39.  
  40. find_grub_dir ()
  41. {
  42.     echo  -n "Searching for GRUB installation directory ... " >&2
  43.  
  44.     for d in /boot/grub /boot/boot/grub ; do
  45.         if [ -d "$d" ] ; then
  46.             grub_dir="$d"
  47.             break
  48.         fi
  49.     done
  50.     
  51.     if [ -z "$grub_dir" ] ; then
  52.         abort "No GRUB directory found.\n To create a template run 'mkdir /boot/grub' first.\n To install grub, install it manually or try the 'grub-install' command.\n ### Warning, grub-install is used to change your MBR. ###"
  53.     else
  54.         echo "found: $grub_dir" >&2
  55.     fi
  56.  
  57.     echo $grub_dir
  58. }
  59.  
  60. # This function was borrowed from grub2/util/update-grub_lib.in
  61. make_system_path_relative_to_its_root ()
  62. {
  63.   path=$1
  64.   # abort if file doesn't exist
  65.   if test -e $path ; then : ;else
  66.     return 1
  67.   fi
  68.  
  69.   # canonicalize
  70.   if path=`readlink -f $path` ; then : ; else
  71.     return 1
  72.   fi
  73.  
  74.   # if not a directory, climb up to the directory containing it
  75.   if test -d $path ; then
  76.     dir=$path
  77.   else
  78.     dir=`echo $path | sed -e "s,/[^/]*$,,g"`
  79.   fi
  80.  
  81.   num=`stat -c %d $dir`
  82.  
  83.   # this loop sets $dir to the root directory of the filesystem we're inspecting
  84.   while : ; do
  85.     parent=`readlink -f $dir/..`
  86.     if [ "x`stat -c %d $parent`" = "x$num" ] ; then : ; else
  87.       # $parent is another filesystem; we found it.
  88.       break
  89.     fi
  90.     if [ "x$dir" = "x/" ] ; then
  91.       # / is our root.
  92.       break
  93.     fi
  94.     dir=$parent
  95.   done
  96.  
  97.   # This function never prints trailing slashes (so that its output can be
  98.   # appended a slash unconditionally).  Each slash in $dir is considered a
  99.   # preceding slash, and therefore the root directory is an empty string.
  100.   if [ "$dir" = "/" ] ; then
  101.     dir=""
  102.   fi
  103.  
  104.   echo $path | sed -e "s,^$dir,,g"
  105. }
  106.  
  107. # The grub installation directory
  108. grub_dir=$(find_grub_dir)
  109.  
  110. # Full path to the device.map
  111. device_map=$grub_dir/device.map
  112.  
  113. find_device ()
  114. {
  115.     if ! test -e ${device_map} ; then
  116.         echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
  117.     fi
  118.     grub-probe --device-map=${device_map} -t device $1 2> /dev/null
  119. }
  120.  
  121. # Usage: convert_raid1 os_device
  122. # Checks if os_device is a software raid1.
  123. # If so, converts to first physical device in array.
  124. convert_raid1 ()
  125. {
  126.     case $1 in
  127.         /dev/md[0-9] | /dev/md/[0-9])
  128.             : ;; # Continue
  129.         *)
  130.             return 1 ;;
  131.     esac
  132.  
  133.     [ -x /sbin/mdadm ] || return 1
  134.  
  135.     # Check that the raid device is raid1
  136.     raidlevel=$(mdadm -D -b $1 | grep "^ARRAY" | \
  137.             sed "s/^.*level=//" | cut -d" " -f1)
  138.     [ "$raidlevel" = "raid1" ] || return 1
  139.     
  140.     # Take only the first device that makes up the raid
  141.     raiddev=$(mdadm -D $1 | grep -A1 "Number" | grep "dev" \
  142.                           | sed "s/^.*\(\/dev\/.*\)$/\1/")
  143.     [ -n "$raiddev" ] || return 1
  144.  
  145.     echo $raiddev
  146.     return 0
  147. }
  148.  
  149. # Usage: convert os_device
  150. # Convert an OS device to the corresponding GRUB drive.
  151. convert () {
  152.     if ! test -e ${device_map} ; then
  153.         echo quit | grub --batch --no-floppy --device-map=${device_map} > /dev/null
  154.     fi
  155.     GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${device_map} -t drive -d "$1" 2> /dev/null || { 
  156.         echo "warning: grub-probe can't find drive for $1." >&2
  157.         tmp_map=$(mktemp -t device.map.XXXXXXXX)
  158.         grub-mkdevicemap --device-map=${tmp_map} --no-floppy >/dev/null 2>&1 || true
  159.         GRUB_LEGACY_0_BASED_PARTITIONS=1 grub-probe --device-map=${tmp_map} -t drive -d "$1" || {
  160.             rm -f ${tmp_map}
  161.             return 1
  162.         }
  163.         echo "Please check ${device_map}, you might have to regenerate it with grub-mkdevicemap." >&2
  164.         rm -f ${tmp_map}
  165.     }
  166. }
  167.  
  168. # Usage: convert_default os_device
  169. # Convert an OS device to the corresponding GRUB drive.
  170. convert_default () {
  171.     # Check if device is software raid1 array
  172.     if tmp_dev=$(convert_raid1 $1 2>/dev/null) ; then
  173.         : # Use device returned by convert_raid1
  174.     else
  175.         tmp_dev=$1
  176.     fi
  177.  
  178.     convert $tmp_dev
  179. }
  180.  
  181. ## Configuration Options
  182.  
  183. # Full path to the menu.lst
  184. menu_file_basename=menu.lst
  185. menu_file=$grub_dir/$menu_file_basename
  186.  
  187. # Full path to the default file
  188. default_file_basename=default
  189. default_file=$grub_dir/$default_file_basename
  190.  
  191. # the device for the / filesystem
  192. root_device=$(find_device "/")
  193.  
  194. # loop-AES arranges things so that /dev/loop/X can be our root device, but
  195. # the initrds that Linux uses don't like that.
  196. case ${root_device} in
  197.   /dev/loop/*|/dev/loop[0-9])
  198.     root_device=`losetup ${root_device} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  199.   ;;
  200. esac
  201.  
  202. # the device for the /boot filesystem
  203. boot_device=$(find_device "/boot")
  204.  
  205. # where grub looks for the kernels at boot time
  206. kernel_dir=`make_system_path_relative_to_its_root /boot`
  207.  
  208. # the "-t abstraction" check is a workaround untill #484297 is fixed
  209. if abstraction=`grub-probe -t abstraction --device ${root_device} 2> /dev/null` && [ "$abstraction" = "" ] && \
  210.     root_uuid=`grub-probe --device-map=${device_map} --device ${root_device} --target=fs_uuid 2> /dev/null` && \
  211.     test -e "/dev/disk/by-uuid/${root_uuid}" ; then
  212.   linux_root_device=UUID=${root_uuid}
  213. else
  214.   linux_root_device=${root_device}
  215. fi
  216.  
  217. # Default kernel options, overidden by the kopt statement in the menufile.
  218. kopt="root=$linux_root_device ro"
  219.  
  220. # Title
  221. title=$(lsb_release --short --description 2>/dev/null) || title="Ubuntu"
  222.  
  223. # should update-grub remember the default entry
  224. updatedefaultentry="false"
  225.  
  226. # Drive(in GRUB terms) where the kernel is located. Overridden by the
  227. # groot statement in menufile.
  228. grub_root_device=$(convert_default "$boot_device")
  229.  
  230. # should grub create the alternative boot options in the menu
  231.     alternative="true"
  232.  
  233. # should grub lock the alternative boot options in the menu
  234.     lockalternative="false"
  235.  
  236. # additional options to use with the default boot option, but not with the
  237. # alternatives
  238.     defoptions="quiet splash"
  239.  
  240. # should grub lock the old kernels
  241.     lockold="false"
  242.  
  243. # Xen hypervisor options to use with the default Xen boot option
  244.     xenhopt=""
  245.  
  246. # Xen Linux kernel options to use with the default Xen boot option
  247.     xenkopt="console=tty0"
  248.  
  249. # options to use with the alternative boot options
  250.     altoptions="(recovery mode) single"
  251.  
  252. # controls howmany kernels are listed in the config file,
  253. # this does not include the alternative kernels
  254.     howmany="all"
  255.  
  256. # should grub create a memtest86 entry
  257.     memtest86="true"
  258.  
  259. # should grub add "savedefault" to default boot options
  260.     savedefault="false"
  261.  
  262. # stores the command line arguments
  263.     command_line_arguments=$1
  264.  
  265. # does this version of grub support the quiet option?
  266. if [ -f ${grub_dir}/installed-version ] && dpkg --compare-versions `cat ${grub_dir}/installed-version` ge 0.97-11ubuntu4; then
  267.     supports_quiet=true
  268. else
  269.     supports_quiet=false
  270. fi
  271.  
  272. # read user configuration
  273. if test -f "/etc/default/grub" ; then
  274.     . /etc/default/grub
  275. fi
  276.  
  277. # Default options to use in a new config file. This will only be used if $menu_file
  278. # doesn't already exist. Only edit the lines between the two "EOF"s. The others are
  279. # part of the script.
  280. newtemplate=$(tempfile)
  281. cat > "$newtemplate" <<EOF
  282. # $menu_file_basename - See: grub(8), info grub, update-grub(8)
  283. #            grub-install(8), grub-floppy(8),
  284. #            grub-md5-crypt, /usr/share/doc/grub
  285. #            and /usr/share/doc/grub-legacy-doc/.
  286.  
  287. ## default num
  288. # Set the default entry to the entry number NUM. Numbering starts from 0, and
  289. # the entry number 0 is the default if the command is not used.
  290. #
  291. # You can specify 'saved' instead of a number. In this case, the default entry
  292. # is the entry saved with the command 'savedefault'.
  293. # WARNING: If you are using dmraid do not change this entry to 'saved' or your
  294. # array will desync and will not let you boot your system.
  295. default        0
  296.  
  297. ## timeout sec
  298. # Set a timeout, in SEC seconds, before automatically booting the default entry
  299. # (normally the first entry defined).
  300. timeout        5
  301.  
  302. # Pretty colours
  303. color cyan/blue white/blue
  304.  
  305. ## password ['--md5'] passwd
  306. # If used in the first section of a menu file, disable all interactive editing
  307. # control (menu entry editor and command-line)  and entries protected by the
  308. # command 'lock'
  309. # e.g. password topsecret
  310. #      password --md5 \$1\$gLhU0/\$aW78kHK1QfV3P2b2znUoe/
  311. # password topsecret
  312.  
  313. #
  314. # examples
  315. #
  316. # title        Windows 95/98/NT/2000
  317. # root        (hd0,0)
  318. # makeactive
  319. # chainloader    +1
  320. #
  321. # title        Linux
  322. # root        (hd0,1)
  323. # kernel    /vmlinuz root=/dev/hda2 ro
  324. #
  325.  
  326. #
  327. # Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST
  328.  
  329. EOF
  330. ## End Configuration Options
  331.  
  332. echo -n "Searching for default file ... " >&2
  333. if [ -f "$default_file" ] ; then
  334.   echo "found: $default_file" >&2
  335. else
  336.   echo "Generating $default_file file and setting the default boot entry to 0" >&2
  337.   if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
  338.     /usr/lib/grub-legacy/grub-set-default $1
  339.   else
  340.     grub-set-default $1
  341.   fi
  342. fi
  343.  
  344. # Make sure we use the standard sorting order
  345. LC_COLLATE=C
  346. # Magic markers we use
  347. start="### BEGIN AUTOMAGIC KERNELS LIST"
  348. end="### END DEBIAN AUTOMAGIC KERNELS LIST"
  349.  
  350. startopt="## ## Start Default Options ##"
  351. endopt="## ## End Default Options ##"
  352.  
  353. # Extract options from config file
  354. ExtractMenuOpt()
  355. {
  356.     opt=$1
  357.  
  358.     sed -ne "/^$start\$/,/^$end\$/ {
  359.         /^$startopt\$/,/^$endopt\$/ {
  360.             /^# $opt=/ {
  361.                 s/^# $opt=\(.*\)\$/\1/
  362.                 p
  363.             }
  364.         }
  365.     }" $menu
  366. }
  367.  
  368. GetMenuOpts()
  369. {
  370.     opt=$1
  371.  
  372.     sed -ne "/^$start\$/,/^$end\$/ {
  373.         /^$startopt\$/,/^$endopt\$/ {
  374.             /^# $opt=/ {
  375.                 p
  376.             }
  377.         }
  378.     }" $menu
  379. }
  380.  
  381. ExtractMenuOpts()
  382. {
  383.     opt=$1
  384.  
  385.     GetMenuOpts $opt | sed "s/^# $opt=\(.*\)\$/\1=\"\2\"/"
  386. }
  387.  
  388. GetMenuOpt()
  389. {
  390.     opt=$1
  391.     value=$2
  392.  
  393.     [ -z "$(GetMenuOpts "$opt")" ] || value=$(ExtractMenuOpt "$opt")
  394.  
  395.     echo $value
  396. }
  397.  
  398. # Compares two version strings A and B
  399. # Returns -1 if A<B
  400. #          0 if A==B
  401. #          1 if A>B
  402. # This compares version numbers of the form
  403. # 2.4.14.2 > 2.4.14
  404. # 2.4.14random = 2.4.14-random > 2.4.14-ac10 > 2.4.14 > 2.4.14-pre2 > 
  405. # 2.4.14-pre1 > 2.4.13-ac99
  406. CompareVersions()
  407. {  
  408.     local a=`echo $1 | sed -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\)/~\1/g"`
  409.     local b=`echo $2 | sed -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\)/~\1/g"`
  410.     if [ "$a" = "$b" ] ; then
  411.         echo 0
  412.     elif dpkg --compare-versions "$a" gt "$b" ; then
  413.         echo 1
  414.     else
  415.         echo -1
  416.     fi
  417. }
  418.  
  419. # looks in the directory specified for an initrd image with the version specified
  420. FindInitrdName()
  421. {
  422.     # strip trailing slashes
  423.     directory=$(echo $1 | sed -e 's#/*$##')
  424.     version=$2
  425.  
  426.     # initrd
  427.     # initrd.img
  428.     # initrd-lvm
  429.     # .*.gz
  430.  
  431.     initrdName=""
  432.     names="initrd initrd.img initrd-lvm"
  433.     compressed="gz"
  434.  
  435.     for n in $names ; do
  436.         # make sure we haven't already found it
  437.         if [ -z "$initrdName" ] ; then
  438.             if [ -f "$directory/$n$version" ] ; then
  439.                 initrdName="$n$version"
  440.                 break
  441.             else
  442.                 for c in $compressed ; do
  443.                     if [ -f "$directory/$n$version.$c" ] ; then
  444.                         initrdName="$n$version.$c"
  445.                         break
  446.                     fi
  447.                 done
  448.             fi
  449.         else
  450.             break
  451.         fi
  452.     done
  453.  
  454.     # return the result
  455.     echo $initrdName
  456. }
  457.  
  458. FindXenHypervisorVersions ()
  459. {
  460.     version=$1
  461.  
  462.     if [ -f "/var/lib/linux-image-$version/xen-versions" ]; then
  463.         ret="$(cat /var/lib/linux-image-$version/xen-versions)"
  464.     fi
  465.  
  466.     echo $ret
  467. }
  468.  
  469. get_kernel_opt()
  470. {
  471.     kernel_version=$1
  472.  
  473.     version=$(echo $kernel_version | sed 's/^[^0-9]*//')
  474.     version=$(echo $version | sed 's/[-\+\.]/_/g')
  475.     if [ -n "$version" ] ; then
  476.         while [ -n "$version" ] ; do
  477.             currentOpt="$(eval "echo \${kopt_$version}")"
  478.             if [ -n "$currentOpt" ] ; then
  479.                 break
  480.             fi
  481.             version=$(echo $version | sed 's/_\?[^_]*$//')
  482.         done
  483.     fi
  484.  
  485.     if [ -z "$currentOpt" ] ; then
  486.             currentOpt=$kopt
  487.     fi
  488.  
  489.     echo $currentOpt
  490. }
  491.  
  492. write_kernel_entry()
  493. {
  494.     local kernel_version; kernel_version=$1; shift
  495.     local recovery_desc; recovery_desc=$1; shift
  496.     local lock_alternative; lock_alternative=$1; shift
  497.     local grub_root_device; grub_root_device=$1; shift
  498.     local kernel; kernel=$1; shift
  499.     local kernel_options; kernel_options=$1; shift
  500.     local recovery_suffix; recovery_suffix=$1; shift
  501.     local initrd; initrd=$1; shift
  502.     local savedefault; savedefault=$1; shift
  503.     local lockold; lockold=$1; shift
  504.     local hypervisor
  505.     if [ -n "$1" ]; then
  506.         # Hypervisor.
  507.         hypervisor=$1; shift
  508.         local hypervisor_image; hypervisor_image=$1; shift
  509.         local hypervisor_version; hypervisor_version=$1; shift
  510.         local hypervisor_options; hypervisor_options=$1; shift
  511.     fi
  512.  
  513.     local grub_root_type
  514.     case "$grub_root_device" in
  515.     [^A-Za-z0-9]*)    grub_root_type='root' ;;
  516.     *)        grub_root_type='uuid' ;;
  517.     esac
  518.  
  519.     echo -n "title        " >> $buffer
  520.  
  521.     if [ -n "$hypervisor" ]; then
  522.         echo -n "$hypervisor $hypervisor_version / " >> $buffer
  523.     fi
  524.  
  525.     echo -n "$title" >> $buffer
  526.     if [ -n "$kernel_version" ]; then
  527.         echo -n ", " >> $buffer
  528.         # memtest86 is not strictly a kernel
  529.         if ! echo "$kernel_version" | grep -q ^memtest86; then
  530.             echo -n "kernel " >> $buffer
  531.         fi
  532.         echo -n "$kernel_version" >> $buffer
  533.     fi
  534.     if [ -n "$recovery_desc" ]; then
  535.         echo -n " $recovery_desc" >> $buffer
  536.     fi
  537.     echo >> $buffer
  538.  
  539.     # lock the alternative options
  540.     if test x"$lock_alternative" = x"true" ; then
  541.         echo "lock" >> $buffer
  542.     fi
  543.     # lock the old entries
  544.     if test x"$lockold" = x"true" ; then
  545.     echo "lock" >> $buffer
  546.     fi
  547.  
  548.     echo "$grub_root_type        $grub_root_device" >> $buffer
  549.  
  550.     echo -n "kernel        "  >> $buffer
  551.     if [ -n "$hypervisor" ]; then
  552.         echo -n "$hypervisor_image" >> $buffer
  553.         if [ -n "$hypervisor_options" ]; then
  554.             echo -n " $hypervisor_options"  >> $buffer
  555.         fi
  556.         echo >> $buffer
  557.         echo -n "module        "  >> $buffer
  558.     fi
  559.     echo -n "$kernel"  >> $buffer
  560.     if [ -n "$kernel_options" ]; then
  561.         echo -n " $kernel_options"  >> $buffer
  562.     fi
  563.     if [ -n "$recovery_desc" ]; then
  564.         echo -n " $recovery_suffix"  >> $buffer
  565.     fi
  566.     echo >> $buffer
  567.  
  568.     if [ -n "$initrd" ]; then
  569.         if [ -n "$hypervisor" ]; then
  570.             echo -n "module        " >> $buffer
  571.         else
  572.             echo -n "initrd        " >> $buffer
  573.         fi
  574.         echo "$initrd" >> $buffer
  575.     fi
  576.  
  577.     if [ ! -n "$recovery_desc" -a x"$supports_quiet" = x"true" ]; then
  578.         echo "quiet" >> $buffer
  579.     fi
  580.  
  581.     if test x"$savedefault" = x"true" ; then
  582.         echo "savedefault" >> $buffer
  583.     fi
  584.     echo >> $buffer
  585. }
  586.  
  587.  
  588. echo -n "Testing for an existing GRUB $menu_file_basename file ... " >&2
  589.  
  590. # Test if our menu file exists
  591. if [ -f "$menu_file" ] ; then
  592.     menu="$menu_file"
  593.     rm -f $newtemplate
  594.     unset newtemplate
  595.     echo "found: $menu_file" >&2
  596.     cp -f "$menu_file" "$menu_file~"
  597. else
  598.     # if not ask user if they want us to create one
  599.     menu="$menu_file"
  600.     echo >&2
  601.     echo >&2
  602.     if [ "-y" = "$command_line_arguments" ] ; then
  603.         echo "Warning: ignoring deprecated -y option." >&2
  604.     fi
  605.     echo >&2
  606.     echo "Generating $menu_file" >&2
  607.     cat "$newtemplate" > $menu_file
  608.     rm -f $newtemplate
  609.     unset newtemplate
  610. fi
  611.  
  612. # Extract the kernel options to use
  613. kopt=$(GetMenuOpt "kopt" "$kopt")
  614.  
  615. # Set the kernel 2.6 option only for fresh install
  616. test -z "$(GetMenuOpt "kopt" "")" && kopt_2_6="root=$linux_root_device ro"
  617.  
  618. # Extract options for specific kernels
  619. opts="$(ExtractMenuOpts "\(kopt_[[:alnum:]_]\+\)")"
  620. test -z "$opts" || eval "$opts"
  621. CustomKopts=$(GetMenuOpts "\(kopt_[[:alnum:]_]\+\)")
  622.  
  623. # Extract the grub root
  624. grub_root_device=$(GetMenuOpt "groot" "$grub_root_device")
  625.  
  626. # Extract the old recovery value
  627. alternative=$(GetMenuOpt "recovery" "$alternative")
  628.  
  629. # Extract the alternative value
  630. alternative=$(GetMenuOpt "alternative" "$alternative")
  631.  
  632. # Extract the lockalternative value
  633. lockalternative=$(GetMenuOpt "lockalternative" "$lockalternative")
  634.  
  635. # Extract the additional default options
  636. defoptions=$(GetMenuOpt "defoptions" "$defoptions")
  637.  
  638. # Extract the lockold value
  639. lockold=$(GetMenuOpt "lockold" "$lockold")
  640.  
  641. # Extract Xen hypervisor options
  642. xenhopt=$(GetMenuOpt "xenhopt" "$xenhopt")
  643.  
  644. # Extract Xen Linux kernel options
  645. xenkopt=$(GetMenuOpt "xenkopt" "$xenkopt")
  646.  
  647. # Extract the howmany value
  648. howmany=$(GetMenuOpt "howmany" "$howmany")
  649.  
  650. # Extract the memtest86 value
  651. memtest86=$(GetMenuOpt "memtest86" "$memtest86")
  652.  
  653.  
  654. # Extract the updatedefaultentry option
  655. updatedefaultentry=$(GetMenuOpt "updatedefaultentry" "$updatedefaultentry")
  656.  
  657. # Extract the savedefault option
  658. savedefault=$(GetMenuOpt "savedefault" "$savedefault")
  659.  
  660. # Generate the menu options we want to insert
  661. buffer=$(tempfile)
  662. echo $start >> $buffer
  663. echo "## lines between the AUTOMAGIC KERNELS LIST markers will be modified" >> $buffer
  664. echo "## by the debian update-grub script except for the default options below" >> $buffer
  665. echo >> $buffer
  666. echo "## DO NOT UNCOMMENT THEM, Just edit them to your needs" >> $buffer
  667. echo >> $buffer
  668. echo "## ## Start Default Options ##" >> $buffer
  669.  
  670. echo "## default kernel options" >> $buffer
  671. echo "## default kernel options for automagic boot options" >> $buffer
  672. echo "## If you want special options for specific kernels use kopt_x_y_z" >> $buffer
  673. echo "## where x.y.z is kernel version. Minor versions can be omitted." >> $buffer
  674. echo "## e.g. kopt=root=/dev/hda1 ro" >> $buffer
  675. echo "##      kopt_2_6_8=root=/dev/hdc1 ro" >> $buffer
  676. echo "##      kopt_2_6_8_2_686=root=/dev/hdc2 ro" >> $buffer
  677. echo "# kopt=$kopt" >> $buffer
  678. if [ -n "$CustomKopts" ] ; then
  679.     echo "$CustomKopts" >> $buffer
  680. elif [ -n "$kopt_2_6" ] && [ "$kopt" != "$kopt_2_6" ]; then
  681.     echo "# kopt_2_6=$kopt_2_6" >> $buffer
  682. fi
  683. echo >> $buffer
  684.  
  685. echo "## default grub root device" >> $buffer
  686. echo "## e.g. groot=(hd0,0)" >> $buffer
  687. echo "# groot=$grub_root_device" >> $buffer
  688. echo >> $buffer
  689.  
  690. echo "## should update-grub create alternative automagic boot options" >> $buffer
  691. echo "## e.g. alternative=true" >> $buffer
  692. echo "##      alternative=false" >> $buffer
  693. echo "# alternative=$alternative" >> $buffer
  694. echo >> $buffer
  695.  
  696. echo "## should update-grub lock alternative automagic boot options" >> $buffer
  697. echo "## e.g. lockalternative=true" >> $buffer
  698. echo "##      lockalternative=false" >> $buffer
  699. echo "# lockalternative=$lockalternative" >> $buffer
  700. echo >> $buffer
  701.  
  702. echo "## additional options to use with the default boot option, but not with the" >> $buffer
  703. echo "## alternatives" >> $buffer
  704. echo "## e.g. defoptions=vga=791 resume=/dev/hda5" >> $buffer
  705. echo "# defoptions=$defoptions" >> $buffer
  706. echo >> $buffer
  707.  
  708. echo "## should update-grub lock old automagic boot options" >> $buffer
  709. echo "## e.g. lockold=false" >> $buffer
  710. echo "##      lockold=true" >> $buffer
  711. echo "# lockold=$lockold" >> $buffer
  712. echo >> $buffer
  713.  
  714. echo "## Xen hypervisor options to use with the default Xen boot option" >> $buffer
  715. echo "# xenhopt=$xenhopt" >> $buffer
  716. echo >> $buffer
  717.  
  718. echo "## Xen Linux kernel options to use with the default Xen boot option" >> $buffer
  719. echo "# xenkopt=$xenkopt" >> $buffer
  720. echo >> $buffer
  721.  
  722. echo "## altoption boot targets option" >> $buffer
  723. echo "## multiple altoptions lines are allowed" >> $buffer
  724. echo "## e.g. altoptions=(extra menu suffix) extra boot options" >> $buffer
  725. echo "##      altoptions=(recovery) single" >> $buffer
  726.  
  727. if ! grep -q "^# altoptions" $menu ; then
  728.     echo "# altoptions=$altoptions" >> $buffer
  729. else
  730.     grep "^# altoptions" $menu >> $buffer
  731. fi
  732. echo >> $buffer
  733.  
  734. echo "## controls how many kernels should be put into the $menu_file_basename" >> $buffer
  735. echo "## only counts the first occurence of a kernel, not the" >> $buffer
  736. echo "## alternative kernel options" >> $buffer
  737. echo "## e.g. howmany=all" >> $buffer
  738. echo "##      howmany=7" >> $buffer
  739. echo "# howmany=$howmany" >> $buffer
  740. echo >> $buffer
  741.  
  742.  
  743. echo "## should update-grub create memtest86 boot option" >> $buffer
  744. echo "## e.g. memtest86=true" >> $buffer
  745. echo "##      memtest86=false" >> $buffer
  746. echo "# memtest86=$memtest86" >> $buffer
  747. echo >> $buffer
  748.  
  749. echo "## should update-grub adjust the value of the default booted system" >> $buffer
  750. echo "## can be true or false" >> $buffer
  751. echo "# updatedefaultentry=$updatedefaultentry" >> $buffer
  752. echo >> $buffer
  753.  
  754. echo "## should update-grub add savedefault to the default options" >> $buffer
  755. echo "## can be true or false" >> $buffer
  756. echo "# savedefault=$savedefault" >> $buffer
  757. echo >> $buffer
  758.  
  759. echo "## ## End Default Options ##" >> $buffer
  760. echo >> $buffer
  761.  
  762. echo -n "Searching for splash image ... " >&2
  763. current_splash=`grep '^splashimage=' ${menu_file} || true`
  764. grub_dir_rel=`make_system_path_relative_to_its_root $grub_dir`
  765. splashimage_path="splashimage=${grub_root_device}/${grub_dir_rel##${kernel_dir}}/splash.xpm.gz"
  766. if [ `sed -e "/^$start/,/^$end/d" $menu_file | grep -c '^splashimage='` != "0" ] ; then
  767.        #checks for splashscreen defined outside the autoupdated part
  768.        splashimage=$(grep '^splashimage=' ${menu_file})
  769.        echo "found: ${splashimage##*=}" >&2
  770.        echo >&2  
  771. elif [ -f "${grub_dir}/splash.xpm.gz" ]  && [ "$current_splash" = "" ]; then
  772.        echo "found: /boot/grub/splash.xpm.gz" >&2
  773.        echo "$splashimage_path" >> $buffer
  774.        echo >> $buffer
  775. elif [ -f "${grub_dir}/splash.xpm.gz" ]  && [ "$current_splash" = "$splashimage_path" ]; then
  776.        echo "found: /boot/grub/splash.xpm.gz" >&2
  777.        echo "$splashimage_path" >> $buffer
  778.        echo >> $buffer
  779. elif [ "$current_splash" != "" ] && [ "$current_splash" != "$splashimage_path" ]; then
  780.        echo "found but preserving previous setting: $(grep '^splashimage=' ${menu_file})" >&2
  781.        echo "$current_splash" >> $buffer
  782.        echo >> $buffer
  783. else
  784.        echo "none found, skipping ..." >&2
  785. fi
  786.  
  787. xen0Kernels=""
  788. # First kernels with xen0 support.
  789. for ver in `grep -l CONFIG_XEN=y /boot/config* | sed -e s%/boot/config-%%`; do
  790.   if ! grep -q CONFIG_XEN_PRIVILEGED_GUEST=y /boot/config-$ver ; then
  791.       continue
  792.   fi
  793.   # ver is a kernel version
  794.   kern="/boot/vmlinuz-$ver"
  795.   if [ -r $kern ] ; then
  796.        newerKernels=""
  797.        for i in $xen0Kernels ; do
  798.                 res=$(CompareVersions "$kern" "$i")
  799.                 if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
  800.                         newerKernels="$newerKernels $kern $i"
  801.                         kern=""
  802.                 else
  803.                         newerKernels="$newerKernels $i"
  804.                 fi
  805.         done
  806.         if [ "$kern" != "" ] ; then
  807.                 newerKernels="$newerKernels $kern"
  808.         fi
  809.         xen0Kernels="$newerKernels"
  810.     fi
  811. done
  812.  
  813. sortedKernels=""
  814. for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep "^vmlinuz-") ; do
  815.         kern="/boot/$kern"
  816.     newerKernels=""
  817.     for i in $sortedKernels ; do
  818.         res=$(CompareVersions "$kern" "$i")
  819.         if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
  820.         newerKernels="$newerKernels $kern $i"
  821.          kern=""
  822.         else
  823.         newerKernels="$newerKernels $i"
  824.         fi
  825.     done
  826.     if [ "$kern" != "" ] ; then
  827.         newerKernels="$newerKernels $kern"
  828.     fi
  829.     sortedKernels="$newerKernels"
  830. done
  831.  
  832. if test -f "/boot/vmlinuz.old" ; then
  833.     sortedKernels="/boot/vmlinuz.old $sortedKernels"
  834. fi
  835. if test -f "/boot/vmlinuz" ; then
  836.     sortedKernels="/boot/vmlinuz $sortedKernels"
  837. fi
  838.  
  839. hypervisors=""
  840. for hyp in /boot/xen-*.gz; do
  841.     if [ ! -h "$hyp" ] && [ -f "$hyp" ]; then
  842.     hypervisors="$hypervisors `basename "$hyp"`"
  843.     fi
  844. done
  845.  
  846. #Finding the value the default line
  847. use_grub_set_default="false"
  848. if test "$updatedefaultentry" = "true" ; then
  849.     defaultEntryNumber=$(sed -ne 's/^[[:blank:]]*default[[:blank:]]*\(.*\).*/\1/p' $menu)
  850.  
  851.     if [ "$defaultEntryNumber" = "saved" ] ; then
  852.         defaultEntryNumber=$(sed 'q' "$grub_dir/default")
  853.         use_grub_set_default="true"       
  854.     fi
  855.     
  856.     if test -n "$defaultEntryNumber"; then    
  857.         defaultEntryNumberPlusOne=$(expr $defaultEntryNumber \+ 1);
  858.         defaultEntry=$(grep "^[[:blank:]]*title" $menu | sed -ne "${defaultEntryNumberPlusOne}p" | sed -ne ";s/^[[:blank:]]*title[[:blank:]]*//p")
  859.         defaultEntry=$(echo $defaultEntry | sed -e "s/[[:blank:]]*$//") # don't trust trailing blanks    
  860.     else
  861.         notChangeDefault="yes"
  862.     fi
  863. else
  864.         notChangeDefault="yes"
  865. fi
  866.  
  867. ## heres where we start writing out the kernel entries
  868. counter=0
  869.  
  870. case "$grub_root_device" in
  871. [^A-Za-z0-9]*)    grub_root_type='root' ;;
  872. *)        grub_root_type='uuid' ;;
  873. esac
  874.  
  875. grub2name="${kernel_dir}/grub/core.img"
  876. if [ "$LET_US_TRY_GRUB_2" = "true" ] \
  877.   && test -f /boot/grub/core.img ; then
  878.     echo "Found GRUB 2: $grub2name" >&2
  879.     cat >> $buffer << EOF
  880. title        Chainload into GRUB 2
  881. $grub_root_type        $grub_root_device
  882. kernel        $grub2name
  883.  
  884. title        `echo ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ | iconv -f utf-8 -t cp437`
  885. root
  886.         
  887. title        When you have verified GRUB 2 works, you can use this command to
  888. root
  889.  
  890. title        complete the upgrade:  upgrade-from-grub-legacy
  891. root
  892.  
  893. title        `echo ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ | iconv -f utf-8 -t cp437`
  894. root
  895.  
  896. EOF
  897. fi
  898.     
  899.  
  900. # Xen entries first.
  901. for kern in $xen0Kernels ; do
  902.     if test ! x"$howmany" = x"all" ; then
  903.         if [ $counter -gt $howmany ] ; then
  904.             break
  905.         fi
  906.     fi
  907.  
  908.     kernelName=$(basename $kern)
  909.     kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
  910.  
  911.     initrdName=$(FindInitrdName "/boot" "$kernelVersion")
  912.     initrd=""
  913.  
  914.     kernel=$kernel_dir/$kernelName
  915.     if [ -n "$initrdName" ] ; then
  916.         initrd=$kernel_dir/$initrdName
  917.     fi
  918.  
  919.     kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
  920.     currentOpt=$(get_kernel_opt $kernelVersion)
  921.  
  922.     hypervisorVersions=$(FindXenHypervisorVersions "$kernelVersion")
  923.  
  924.     found=
  925.     for hypervisorVersion in $hypervisorVersions; do
  926.         hypervisor="$kernel_dir/xen-$hypervisorVersion.gz"
  927.         if [ -e "$hypervisor" ]; then
  928.             found=1
  929.  
  930.             echo "Found Xen hypervisor $hypervisorVersion,  kernel: $kernel" >&2
  931.  
  932.             write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
  933.               "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' \
  934.               Xen "$hypervisor" "$hypervisorVersion" "$xenhopt"
  935.             counter=$(($counter + 1))
  936.         fi
  937.     done
  938.  
  939.     if [ -z $found ]; then
  940.         for hypervisor in $hypervisors; do
  941.             hypVersion=`basename "$hypervisor" .gz | sed s%xen-%%`
  942.         
  943.             echo "Found Xen hypervisor $hypVersion,  kernel: $kernel" >&2
  944.  
  945.             write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
  946.               "$kernel" "$currentOpt $xenkopt" '' "$initrd" "$savedefault" '' \
  947.               Xen "$kernel_dir/$hypervisor" "$hypVersion" "$xenhopt"
  948.             counter=$(($counter + 1))
  949.         done
  950.     fi
  951. done
  952.  
  953. for kern in $sortedKernels ; do
  954.     counter=$(($counter + 1))
  955.     if test ! x"$howmany" = x"all" ; then
  956.         if [ $counter -gt $howmany ] ; then 
  957.             break
  958.         fi
  959.     fi
  960.     kernelName=$(basename $kern)
  961.     kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
  962.     initrdName=$(FindInitrdName "/boot" "$kernelVersion")
  963.     initrd=""
  964.  
  965.     kernel=$kernel_dir/$kernelName
  966.     if [ -n "$initrdName" ] ; then
  967.         initrd=$kernel_dir/$initrdName
  968.     fi
  969.  
  970.     echo "Found kernel: $kernel" >&2
  971.  
  972.     if [ "$kernelName" = "vmlinuz" ]; then
  973.         if [ -L "/boot/$kernelName" ]; then
  974.             kernelVersion=`readlink -f "/boot/$kernelName"`
  975.             kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
  976.             kernelVersion="$kernelVersion Default"
  977.         else
  978.             kernelVersion="Default"
  979.         fi
  980.     fi
  981.     if [ "$kernelName" = "vmlinuz.old" ]; then
  982.         if [ -L "/boot/$kernelName" ]; then
  983.             kernelVersion=`readlink -f "/boot/$kernelName"`
  984.             kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
  985.             kernelVersion="$kernelVersion Previous"
  986.         else
  987.             kernelVersion="Previous"
  988.         fi
  989.     fi
  990.     kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
  991.     
  992.     currentOpt=$(get_kernel_opt $kernelVersion)
  993.  
  994.     do_lockold=$lockold
  995.     # do not lockold for the first entry
  996.     [ $counter -eq 1 ] && do_lockold=false
  997.  
  998.     write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
  999.         "$currentOpt $defoptions" "" "$initrd" "$savedefault" "$do_lockold"
  1000.  
  1001.     # insert the alternative boot options
  1002.     if test ! x"$alternative" = x"false" ; then
  1003.         # for each altoptions line do this stuff
  1004.         sed -ne 's/# altoptions=\(.*\)/\1/p' $buffer | while read line; do
  1005.             descr=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\1/p')
  1006.             suffix=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\2/p')
  1007.  
  1008.             test x"$lockalternative" = x"true" && do_lockold=false
  1009.             write_kernel_entry "$kernelVersion" "$descr" "$lockalternative" \
  1010.                 "$grub_root_device" "$kernel" "$currentOpt" "$suffix" "$initrd" \
  1011.                 "$savedefault" "$do_lockold"
  1012.  
  1013.         done
  1014.     fi
  1015. done
  1016.  
  1017. memtest86names="memtest86 memtest86+"
  1018.  
  1019. if test ! x"$memtest86" = x"false" ; then
  1020.     for name in $memtest86names ; do
  1021.         if test -f "/boot/$name.bin" ; then
  1022.             kernelVersion="$name"
  1023.             kernel="$kernel_dir/$name.bin"
  1024.             currentOpt=
  1025.             initrd=
  1026.  
  1027.             echo "Found kernel: $kernel" >&2
  1028.  
  1029.             write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" \
  1030.             "$kernel" "$currentOpt" "" "$initrd" "false" ""
  1031.         fi
  1032.     done
  1033. fi
  1034.  
  1035. echo $end >> $buffer
  1036.  
  1037. echo -n "Updating $menu ... " >&2
  1038. # Insert the new options into the menu
  1039. if ! grep -q "^$start" $menu ; then
  1040.     cat $buffer >> $menu
  1041.     rm -f $buffer
  1042. else
  1043.     umask 077
  1044.     sed -e "/^$start/,/^$end/{
  1045.     /^$start/r $buffer
  1046.     d
  1047.     }
  1048.     " $menu > $menu.new
  1049.     cat $menu.new > $menu
  1050.     rm -f $buffer $menu.new
  1051. fi
  1052.  
  1053. # Function to update the default value
  1054. set_default_value() {
  1055.     if [ "$use_grub_set_default" = "true" ] ; then
  1056.     if [ -f /usr/lib/grub-legacy/grub-set-default ] ; then
  1057.         /usr/lib/grub-legacy/grub-set-default $1
  1058.     else
  1059.         grub-set-default $1
  1060.     fi
  1061.     else
  1062.     value="$1"
  1063.     newmenu=$(tempfile)
  1064.     sed -e "s/^[[:blank:]]*default[[:blank:]]*[[:digit:]]*\(.*\)/default         ${value}\1/;b" $menu > $newmenu
  1065.     cat $newmenu > $menu
  1066.     rm -f $newmenu
  1067.     unset newmenu
  1068.     fi
  1069. }
  1070.  
  1071. #Updating the default number
  1072. if [ "$LET_US_TRY_GRUB_2" = "true" ] && test -f /boot/grub/core.img ; then
  1073.     set_default_value "0"
  1074. elif test -z "$notChangeDefault"; then
  1075.     newDefaultNumberPlusOne=$(grep "^[[:blank:]]*title[[:blank:]]*" $menu | grep -n "${defaultEntry}" | cut -f1 -d ":" | sed -ne "1p")
  1076.     if test -z "$newDefaultNumberPlusOne"; then
  1077.         echo "Previous default entry removed, resetting to 0">&2
  1078.         set_default_value "0"
  1079.     elif test -z "$defaultEntry"; then
  1080.         echo "Value of default value matches no entry, resetting to 0" >&2
  1081.         set_default_value "0"
  1082.     else
  1083.         if test "$newDefaultNumberPlusOne" = "1"; then
  1084.             newDefaultNumber="0"
  1085.         else
  1086.             newDefaultNumber=$(expr $newDefaultNumberPlusOne - 1)
  1087.         fi
  1088.         echo "Updating the default booting kernel">&2
  1089.         set_default_value "$newDefaultNumber"
  1090.     fi
  1091. fi
  1092.  
  1093. echo "done" >&2
  1094. echo >&2
  1095.